package com.da.javatest.interview.other.cglib3;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.LazyLoader;

/**
 * @author chenlida
 * @date 2020/6/5 23:12
 *
 * 当第1次调用say方法的时候，会被cglib拦截，进入lazyLoader的loadObject内部，将这个方法的返回值作为say方法的调用者，
 * loadObject中返回了一个 达少 的UserModel，cglib内部会将loadObject方法的返回值和say方法关联起来，
 * 然后缓存起来，而第2次调用say方法的时候，通过方法名去缓存中找，会直接拿到第1次返回的UserModel，所以第2次不会进入到loadObject方法中了。
 */
public class CglibLazyLoad {
    public static class UserModel {
        private String name;

        public UserModel() {
        }

        public UserModel(String name) {
            this.name = name;
        }

        public void say() {
            System.out.println("你好：" + name);
        }
    }

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UserModel.class);
        enhancer.setCallback((LazyLoader)() -> {
            System.out.println("调用LazyLoader.loadObject()方法");
            return new UserModel("达少");
        });

        UserModel userModel = (UserModel)enhancer.create();
        System.out.println("第1次调用say方法");
        userModel.say();
        System.out.println("第2次调用say方法");
        userModel.say();
    }
}

